package com.boat.framework.base.exception;

/**
 * 公共错误码
 * 
 * 
 * 错误码组成:应用标识 +功能模块+ 错误类型+错误编码
 * 
 * 应用标识(1位字母)
 * 例如:用户中心:U;ERP系统: E
 * 
 * 功能模块(2位数字)
 * 例如:末分类:00;用户登录鉴权:01;......
 * 
 * 错误类型(1位字母) 
 * 例如:认证授权:A; 业务错误:B; 缓存错误:C; 数据库错误:D; 文件I0错误:F; 网络错误:N; 其他错误:O; 参数错误:P; RPC错误:R;系统错误:S;
 * 
 * 错误编码(2位数字) 自增即可，每个模块的每种错误类型可以注册100个错误，如果使用合理的话，是完全够用的
 * 
 * 错误码位数:6位，位数固定 
 * 
 * 错误码示例: U01P01，我们可以看出这是用户中心服务的登录鉴权模块报出的参数校验异常，错误编码为01
 * 使用规范:只增不改，避免混乱，并且要避免使用者随意定义新的错误码 正常情况返回:正常情况返回时使用固定值 000000 填充
 * 
 * @author 周江
 *
 */
public enum CommonErrorCode implements ErrorCode {

	/** 公共错误码 **/
	SUCCESS("000000", "success"), // 成功
	
	/** 系统错误:S **/
	SYSTEM_ERROR("A00S01", "系统异常，请联系管理员"), // 稍后重试
	PAGE_NO_FIND("A00S02", "页面未找到"), // 可能是地址错误
	REPEATED_REQUEST("A00S03", "已经处理过，请勿重复请求"), // 重复请求

	/** 流量控制:L **/
	FLOW_LIMIT("A00L01", "接口访问次数量已超出限制"), // 被限流
	SERVICE_DEGRADE("A00L02", "服务不稳定已触发降级"), // 服务降级

	/** 权限控制:A **/
	AUTH_USER_NO_LOGIN("A00A01", "用户没有登录"),
	AUTH_PERMISSION_DENIED("A00A02", "没有权限访问此功能"),

	/** 非法参数:P **/
	MISSING_PARAMETER("A00P01", "缺少参数：%s"), // 缺少参数
	INVALID_PARAMETER("A00P02", "参数无效：%s"), // 检查参数，格式不对、非法值、越界等
	
	/** RPC调用: R**/
	SECOND_CALL_ERROR("A00R01", "二方接口错误：%s"), // 稍后重试
	THIRD_CALL_ERROR("A00R02", "三方接口错误：%s"), // 稍后重试
	
	/** 数据库操作：D **/
	DATA_NO_FIND("A00D01", "数据未找到"), 
	TABLE_INSERT_ERROR("A00D02", "写入%s表失败"),
	TABLE_UPDATE_ERROR("A00D03", "更新%s表失败"), 
	TABLE_QUERY_ERROR("A00D04", "查询%s失败"),
	DATABASE_ACCESS_ERROR("A00D05", "数据库访问异常");

	private String code;
	private String message;

	CommonErrorCode(String code, String message) {
		this.code = code;
		this.message = message;
	}

	@Override
	public String getCode() {
		return code;
	}

	@Override
	public String getMessage() {
		return message;
	}

//	/**
//	 * 使用方法：CommonErrorCode.INVALID_PARAMETER.getMessage(new String[] {"请求地址不正确"})
//	 * @param param
//	 * @return
//	 */
//	public String getMessage(Object param[]) {
//		if (param != null) {
//			return String.format(this.message, param);
//		}
//
//		return getMessage();
//	}

}
